import { reactive, ref, watchEffect } from 'vue'
import type {Reactive, Ref} from 'vue'
import type { StoreType, FileObjType,QueueStatusType,GlobalUploadStatus,FileStatusType } from '../../types/index.ts'

class StoreService {
  // public store: StoreType;
  public fileList: Ref<FileObjType[]>;
  public queueStatus: Ref<QueueStatusType>;
  public filesTotalSize: Ref<number>;
  public globalUploadStatus: Ref<GlobalUploadStatus>;

  constructor() {
    // 初始化文件列表
    this.fileList = ref<FileObjType[]>([])
    // 队列状态
    this.queueStatus = ref<QueueStatusType>({
      queueFileNum: 0, // 文件数
      queueTaskNum: 0, // 队列任务数
      queueTaskTotalSize: 0, // 队列任务总大小
      runningNum: 0, // 当前并发池任务数
      concurrency: 0, // 并发请求数
      pausedFileNum: 0, // 已暂停文件数
      pausedTaskNum: 0, // 已暂停任务数
      waitingFileNum: 0, // 等待中文件数
      waitingTaskNum: 0, // 等待中任务数
      completedFileNum: 0, // 已完成文件数
      completedTaskNum: 0, // 已完成任务数
      failedFileNum: 0, // 失败文件数
      failedTaskNum: 0, // 失败任务数
      chunkSize: 0, // 分片大小
    })
    // 所有文件总大小
    this.filesTotalSize = ref(0);
    // 全局上传状态
    this.globalUploadStatus = ref<GlobalUploadStatus>('start')

    // 初始化监听器
    // this.initWatchers();
  }

  // 获取store实例
  getInstance() {
    return reactive({
      fileList: this.fileList,
      queueStatus: this.queueStatus,
      filesTotalSize: this.filesTotalSize,
      globalUploadStatus: this.globalUploadStatus,
    });
  }

  // 重置store
  async resetStore() {
    this.fileList.value = [];
    this.queueStatus.value = {
      queueFileNum: 0, // 文件数
      queueTaskNum: 0, // 队列任务数
      queueTaskTotalSize: 0, // 队列任务总大小
      runningNum: 0, // 当前并发池任务数
      concurrency: 0, // 并发请求数
      pausedFileNum: 0, // 已暂停文件数
      pausedTaskNum: 0, // 已暂停任务数
      waitingFileNum: 0, // 等待中文件数
      waitingTaskNum: 0, // 等待中任务数
      completedFileNum: 0, // 已完成文件数
      completedTaskNum: 0, // 已完成任务数
      failedFileNum: 0, // 失败文件数
      failedTaskNum: 0, // 失败任务数
      chunkSize: 0, // 分片大小
    };
    this.filesTotalSize.value = 0;
    this.globalUploadStatus.value = 'start';
  }

  // 更新文件状态
  async updateFileStatus(type: FileStatusType, fileHash: string) {
    this.fileList.value.forEach((item) => {
      if (item.fileHash === fileHash) {
        item.fileStatus = type;
      }
    });
  }

  // 初始化监听器
  private initWatchers() {
    watchEffect(() => {
      console.log('store.filesTotalSize变化', this.filesTotalSize.value);
    });
  }
}

export default StoreService
